home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / share / eselect / modules / env.eselect < prev    next >
Text File  |  2006-04-12  |  6KB  |  218 lines

  1. # Copyright 1999-2005 Gentoo Foundation
  2. # Distributed under the terms of the GNU General Public License v2
  3. # $Id: env.eselect 248 2005-12-19 00:09:40Z kugelfang $
  4.  
  5. inherit config multilib
  6.  
  7. DESCRIPTION="Manage environment variables set in /etc/env.d/"
  8. MAINTAINER="kugelfang@gentoo.org"
  9. SVN_DATE='$Date: 2005-12-19 00:09:40 +0000 (Mon, 19 Dec 2005) $'
  10. VERSION=$(svn_date_to_version "${SVN_DATE}" )
  11.  
  12. # Classes of env-vars
  13. SPECIAL_CLASS="KDEDIRS CLASSPATH INFODIR ROOTPATH CONFIG_PROTECT CONFIG_PROTECT_MASK"
  14. PATH_CLASS="ADA_INCLUDE_PATH ADA_OBJECT_PATH INFOPATH MANPATH PATH PRELINK_PATH
  15.     PRELINK_PATH_MASK PYTHONPATH ROOTPATH"
  16.  
  17. # Configuration files
  18. ENVPROFILE="${ROOT}/etc/profile.env"
  19. LDCONFIG="${ROOT}/etc/ld.so.conf"
  20. PRELINK="${ROOT}/etc/prelink.conf"
  21. LDMTIMEDB="${ROOT}/etc/eselect/ld-mtimedb"
  22.  
  23. # Keep all stored LDPATHS
  24. LDPATH=""
  25.  
  26. # create_profile_env()
  27. # Create profile.env file
  28. create_profile_env() {
  29.     local envfiles vars store items
  30.     envfiles=( ${ROOT}/etc/env.d/* )
  31.     
  32.     # Output to a new file first!
  33.     ENVPROFILE=${ENVPROFILE}.new
  34.     rm -f ${ENVPROFILE} &> /dev/null
  35.  
  36.     # Parse all files in env.d
  37.     for envfile in ${envfiles[@]} ; do
  38.         # Make sure it is a file and no backup file
  39.         [[ -f ${envfile} ]] || continue
  40.         [[ -n ${envfile##*~} ]] || continue
  41.         [[ ${envfile##*.} != bak ]] || continue
  42.  
  43.         if ! file -i ${envfile} | grep -q text/plain ; then
  44.             echo "Skipping non-text file ${envfile}."
  45.         fi
  46.  
  47.         # Which vars are to be loaded?
  48.         # TODO: Change to bash magic?
  49.         vars=$(sed \
  50.             -e '/^#/d' -e '/^\s*$/d' -e '/^.*=/s/^\(.*\)=.*/\1/' \
  51.             ${envfile})
  52.         [[ -z ${vars} ]] && continue
  53.         for var in ${vars} ; do
  54.             # Colon separated?...
  55.             if has ${var} ${PATH_CLASS} ; then
  56.                 store=$(load_config ${ENVPROFILE} ${var})
  57.                 if [[ -z ${store} ]] ; then
  58.                     store=$(load_config ${envfile} ${var})
  59.                 else
  60.                     items="$(load_config ${envfile} ${var})"
  61.                     items=( ${items//:/ } )
  62.                     for item in ${items[@]} ; do
  63.                         has ${item} ${store//:/ } && continue
  64.                         store="${store}:${item}"
  65.                     done
  66.                 fi
  67.                 store_config ${ENVPROFILE} ${var} "${store#:}"
  68.                 continue
  69.             fi
  70.             # ...everything else is space separated!
  71.             if has ${var} ${SPECIAL_CLASS} ; then
  72.                 store=( $(load_config ${ENVPROFILE} ${var}) )
  73.                 if [[ -z ${store[@]} ]] ; then
  74.                     store=( $(load_config ${envfile} ${var}) )
  75.                 else
  76.                     items=( $(load_config ${envfile} ${var}) )
  77.                     for item in ${items[@]} ; do
  78.                         has ${item} ${store[@]} && continue
  79.                         store=( ${store[@]} ${item} )
  80.                     done
  81.                 fi
  82.                 store_config ${ENVPROFILE} ${var} "${store[@]}"
  83.                 continue
  84.             fi
  85.             [[ ${var} == LDPATH ]] && continue
  86.             # Ok, just a non-cummultative var.
  87.             store_config \
  88.                 ${ENVPROFILE} \
  89.                 ${var} \
  90.                 "$(load_config ${envfile} ${var})"
  91.         done
  92.     
  93.         has LDPATH ${vars} || continue
  94.         # Store LDPATH for later processing
  95.         items=$(load_config ${envfile} LDPATH)
  96.         items=( ${items//:/ } )
  97.         for item in ${items[@]} ; do
  98.             has ${item} ${LDPATH[@]} && continue 
  99.             LDPATH=( ${LDPATH[@]} ${item} )
  100.         done
  101.     done
  102.  
  103.     # Move new file onto old one
  104.     ENVPROFILE=${ENVPROFILE%%.new}
  105.     mv ${ENVPROFILE}.new ${ENVPROFILE}
  106. }
  107.  
  108. # create_ld_so_conf()
  109. # Create ld.so.conf file based upon gathered LDPATHs
  110. create_ld_so_conf() {
  111.     [[ -z ${LDPATH[@]} ]] && die -q 'No LDPATHs found in ${ROOT}/etc/env.d/*'
  112.  
  113.     local str
  114.     str="# ld.so.conf autogenerated by eselect\n# Make all changes to /etc/env.d files\n"
  115.     for x in ${LDPATH[@]} ; do
  116.         str="${str}${x}\n"
  117.     done
  118.     echo -e "${str}" > ${LDCONFIG}
  119. }
  120.  
  121. # create_prelink_conf()
  122. # Create prelink.conf file based upon existing profile.env
  123. create_prelink_conf() {
  124.     [[ -z ${LDPATH[@]} ]] && die -q 'No LDPATHs found in ${ROOT}/etc/env.d/*'
  125.     local str
  126.     str="# prelink.conf autogenerated by eselect\n"
  127.     str="${str}# Make all changes to /etc/env.d files\n"
  128.     # Add default items
  129.     for x in /bin /sbin /usr/bin /usr/sbin ; do
  130.         str="${str}-l ${x}\n"    
  131.     done
  132.     for x in $(list_libdirs) ; do
  133.         [[ -e ${ROOT}/${x} ]] && str="${str}-l /${x}\n"
  134.         [[ -e ${ROOT}/usr/${x} ]] && str="${str}-l /usr/${x}\n"
  135.     done
  136.     prelink_mask=$(load_config ${ENVPROFILE} PRELINK_PATH_MASK)
  137.     prelink_mask=( ${prelink_mask//:/ } )
  138.     prelink="$(load_config ${ENVPROFILE} PATH)"
  139.     prelink="${prelink} $(load_config ${ENVPROFILE} PRELINK_PATH)"
  140.     prelink=( ${prelink//:/ } ${LDPATH[@]} )
  141.     for x in ${prelink[@]} ; do
  142.         has ${x} ${prelink_mask} && continue
  143.         [[ -z ${x##*/} ]] || x="${x}/"
  144.         str="${str}-h ${x}\n"
  145.     done
  146.     for x in ${prelink_mask[@]} ; do
  147.         str="${str}-b ${x}\n"
  148.     done
  149.     echo -e "${str}" > ${PRELINK}
  150. }
  151.  
  152. # need_links()
  153. # Returns true if any item of ${LDPATH} has been modified.
  154. need_links() {
  155.     local ret=1
  156.     for x in ${LDPATH[@]} ; do
  157.         y=${x//\//_}
  158.         y=${y//-/_}
  159.         y=${y//./_}
  160.         y=${y//+/_}
  161.         oldmtime=$(load_config ${LDMTIMEDB} "mtime${y}")
  162.         newmtime=$(stat -c %Y ${x} 2> /dev/null)
  163.         if [[ ${oldmtime} != ${newmtime} ]] ; then
  164.             ret=0
  165.             store_config ${LDMTIMEDB} "mtime${y}" ${newmtime}
  166.         fi
  167.     done
  168.     return ${ret}
  169. }
  170.  
  171. # update_ldcache()
  172. # Update ld.so.cache using ldconfig
  173. update_ldcache() {
  174.     echo "Regenerating ${ROOT}/etc/ld.so.cache..."
  175.     (
  176.         cd /
  177.         ldconfig ${1} -r ${ROOT:-/}
  178.     )
  179. }
  180.  
  181. ### update action
  182.  
  183. describe_update() {
  184.     echo "Collect environment variables from all scripts in /etc/env.d/"
  185. }
  186.  
  187. describe_update_parameters() {
  188.     echo "<makelinks>"
  189. }
  190.  
  191. describe_update_options() {
  192.     echo "makelinks : Specify \"makelinks\" to force updating of links"
  193. }
  194.  
  195. do_update() {
  196.     [[ -w ${ROOT}/etc/profile.env ]] || die -q "You need to be root!"
  197.     
  198.     # Create configuration files
  199.     create_profile_env
  200.     create_ld_so_conf
  201.     [[ -e ${ROOT}/usr/sbin/prelink ]] && create_prelink_conf
  202.     makelinks=$( ( need_links || [[ ${1} == makelinks ]] ) && echo "-X" )
  203.     update_ldcache ${makelinks}
  204.         
  205.     # fix up ${ENVPROFILE}
  206.     cp ${ENVPROFILE} ${ENVPROFILE/.env/.csh}
  207.     sed -i \
  208.         -e "s/\"/'/g" \
  209.         -e 's/^\(.*=\)/export \1/' \
  210.         ${ENVPROFILE}
  211.     sed -i \
  212.         -e "s/\"/'/g" \
  213.         -e 's/^\(.*=\)/setenv \1/' \
  214.         ${ENVPROFILE/.env/.csh}
  215. }
  216.  
  217. # vim: ft=eselect
  218.